package com.xingkeduo.business.user.service;

import com.xingkeduo.dao.database.DatabaseAccessObject;
import com.xingkeduo.pojo.query.JobseekerHistoryQO;
import com.xingkeduo.pojo.query.JobseekerQO;
import com.xingkeduo.pojo.table.JobseekerHistoryTO;
import com.xingkeduo.pojo.table.JobseekerTO;
import com.xingkeduo.pojo.table.JobseekerTO.Status;
import com.xingkeduo.util.pojo.enums.HistoryTypeEnum;
import com.xingkeduo.util.pojo.enums.YesNoEnum;
import com.xingkeduo.util.pojo.exception.DataException;
import com.xingkeduo.util.tool.CommonUtil;
import com.xingkeduo.util.tool.IdentityUtil;
import com.xingkeduo.util.tool.IdentityUtil.Worker;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * 求职者封装类
 * 
 * @author 高杰
 * @time 2018年12月25日 下午1:41:24
 * @description
 */
@Component
public class JobseekerService {
	private static final String NAMESPACE = CommonUtil.formatNamespace(JobseekerTO.class);
	private static final String NAMESPACE_HISTORY = CommonUtil.formatNamespace(JobseekerHistoryTO.class);
	@Resource(name = "mysqlUserMasterDao")
	private DatabaseAccessObject<JobseekerTO, JobseekerQO> dao;
	@Resource(name = "mysqlUserMasterDao")
	private DatabaseAccessObject<JobseekerHistoryTO, JobseekerHistoryQO> historyDao;

	/**
	 * 查询
	 * 
	 * @author 高杰
	 * @time 2018年12月26日 下午6:26:02
	 * @param id
	 * @return
	 * @throws Throwable
	 */
	public JobseekerTO selectByPrimary(long id) throws Throwable {
		return dao.select(NAMESPACE, id);
	}

	/**
	 * 查询
	 * 
	 * @author 高杰
	 * @time 2018年12月26日 下午6:26:02
	 * @param login
	 * @return
	 * @throws Throwable
	 */
	public JobseekerTO selectByLogin(String login) throws Throwable {
		List<JobseekerTO> list = dao.select(NAMESPACE, new JobseekerQO().setLogin(login));
		if (CommonUtil.isEmpty(list))
			return null;
		return list.get(0);
	}

	/**
	 * 查询
	 * 
	 * @author 高杰
	 * @time 2019年1月2日 下午4:35:01
	 * @param query
	 * @return
	 * @throws Throwable
	 */
	public List<JobseekerTO> selectByQuery(JobseekerQO query) throws Throwable {
		query.setIsDelete(YesNoEnum.NO);
		return dao.select(NAMESPACE, query);
	}

	/**
	 * 新增
	 * 
	 * @author 高杰
	 * @time 2018年12月25日 下午2:19:27
	 * @param jobseeker
	 * @throws Throwable
	 */
	@Transactional
	public void insert(JobseekerTO jobseeker) throws Throwable {
		jobseeker.initId(IdentityUtil.nextId(Worker.USER));
		jobseeker.setStatus(Status.INIT);
		jobseeker.setCreatedBy(jobseeker.getId());
		jobseeker.setUpdatedBy(jobseeker.getCreatedBy());

		if (dao.insert(NAMESPACE, jobseeker) < 1)
			throw new DataException(DataException.Type.FAIL, "求职者账户信息");

		JobseekerHistoryTO jobseekerHistory = new JobseekerHistoryTO().setHistoryType(HistoryTypeEnum.NEW)
				.setHistoryId(IdentityUtil.nextId(Worker.USER))
				.setJobseeker(jobseeker.setIsDelete(YesNoEnum.NO).setVersion(1)).setCreatedBy(jobseeker.getCreatedBy())
				.setUpdatedBy(jobseeker.getUpdatedBy());
		historyDao.insert(NAMESPACE_HISTORY, jobseekerHistory);
	}

	/**
	 * 更新
	 * 
	 * @author 高杰
	 * @time 2018年12月25日 下午2:19:27
	 * @param jobseeker
	 * @throws Throwable
	 */
	@Transactional
	public void update(JobseekerTO jobseeker) throws Throwable {
		if (dao.update(NAMESPACE, jobseeker) < 1)
			throw new DataException(DataException.Type.FAIL, "求职者账户信息");

		jobseeker = dao.select(NAMESPACE, jobseeker.getId());

		JobseekerHistoryTO jobseekerHistory = new JobseekerHistoryTO().setHistoryType(HistoryTypeEnum.MODIFY)
				.setHistoryId(IdentityUtil.nextId(Worker.USER)).setJobseeker(jobseeker)
				.setCreatedBy(jobseeker.getUpdatedBy()).setUpdatedBy(jobseeker.getUpdatedBy());
		historyDao.insert(NAMESPACE_HISTORY, jobseekerHistory);
	}

	/**
	 * 查询总数
	 * 
	 * @author 高杰
	 * @time 2018年12月26日 下午1:16:13
	 * @return
	 * @throws Throwable
	 */
	public int countByPrimary(long id) throws Throwable {
		return count(new JobseekerQO().setId(id));
	}

	/**
	 * 查询总数
	 * 
	 * @author 高杰
	 * @time 2018年12月26日 下午1:16:13
	 * @return
	 * @throws Throwable
	 */
	public int countByLogin(String login) throws Throwable {
		return count(new JobseekerQO().setLogin(login));
	}

	/**
	 * 查询总数
	 * 
	 * @author 高杰
	 * @time 2018年12月26日 下午1:16:13
	 * @param jobseekerQuery
	 * @return
	 * @throws Throwable
	 */
	public int count(JobseekerQO jobseekerQuery) throws Throwable {
		return dao.selectCount(NAMESPACE, jobseekerQuery);
	}
}
